package com.yifan.testArray;

import java.util.Arrays;

/**
 * @Author YIFan
 * @Date 2020/6/7 10:40
 * @Version 1.0
 */
public class ArrayUtil {

    // 目标数组
    private int[] target;

    // 创建数组
    public ArrayUtil() {
        target = new int[0];
    }

    // 查看数组长度
    public int size(){
        return target.length;
    }

    // 查看数组元素
    public void getinto(){
        System.err.println(Arrays.toString(target));
    }

    // 数组的末尾添加元素
    public void add(int ele){
        int[] newArray = new int[target.length + 1];
        for (int i = 0; i < target.length; i++) {
            newArray[i] = target[i];
        }
        newArray[target.length] = ele;
        target = newArray;
    }

    // 数组删除元素--根据下标
    public void del(int ele_index){
        // 判断下标
        if( ele_index < 0 || ele_index > target.length-1 ){
            throw new RuntimeException("下标越界...");
        }
        int[] newArray = new int[target.length - 1];
        // 复制原有数组到新数组
        for (int i = 0; i < newArray.length; i++) {
            if(i < ele_index){// 删除元素之前的元素
                newArray[i] = target[i];
            }else {// 删除元素之后的元素
                newArray[i] = target[i+1];
            }
        }
        target = newArray;
    }

    // 插件元素到指定位置
    public void insert (int index,int ele){
        int[] newArray = new int[target.length + 1];
        if (index < 0 || index> newArray.length-1){
            throw new RuntimeException("数组越界...");
        }
        for (int i = 0; i < target.length; i++) {
            if( i < index){//目标位置之前的元素
                newArray[i] = target[i];
            }else {// 目标位置之后的元素
                newArray[i+1] = target[i];
            }
        }
        // 插入新的元素
        newArray[index] = ele;
        // 新数组替换旧数组
        target = newArray;

    }

    // 替换指定位置的元素
    public void set(int index, int ele){
        target[index] = ele;
    }

    // 线性查找  -- 效率低
    public int search(int ele){
        for (int i = 0; i < target.length; i++) {
            if (target[i] == ele){
             return i ;
            }
        }
        return -1 ;
    }

    // 二分法查找 -- 数组元素需是顺序排列
    public int binarySearch(int ele){
        // 记录开始位置
        int start  = 0;
        // 记录结束位置
        int end = target.length-1 ;
        // 记录中间位置
        int mid = ( start + end ) / 2 ;
        // 循环查找
        while (true){
            // 开始位置和结束位置重合 或者  开始在结束之后  既  没有这个元素
            if(start > end ){
                 return  -1 ;
            }
            // 判断中间这个元素是不是要查找的
            if(target[mid] == ele ){// 是
             return mid;
            }else {
                // 判断中间元素和目标元素的大小
                if( target[mid] > ele ){
                    // 把结束位置调整到中间位置前一个
                    end = mid - 1 ;
                }else {
                    // 把开始位置调整到中间位置后一个
                    start = mid + 1 ;
                }
                // 取出新的中间位置
                mid = ( start + end ) / 2 ;
            }
        }
    }


}
